﻿#pragma once

//@模块名称  音频播放
//@版本  1.1
//@日期  2024-11-14
//@作者  zgr封装  
//@模块备注 封装自BASS项目http://www.un4seen.com/,几乎支持市面上所有的音频格式,基础版只封装了音频播放相关功能，至于混音效果下个版本增加。
//@依赖  module_base.h
//@QQ 154460336

#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include "bass.h"
  
#ifdef  _WIN64
//@lib  "x64\bass_x64.lib"
//@复制文件 @当前模块路径 "x64\bass.dll"
#else
//@lib  "x86\bass.lib"
//@复制文件 @当前模块路径 "x86\bass.dll"
#endif

//@src "module_bass.cpp"


//@备注 播放音频类 需要先初始化
//@别名 播放音频
class BassAudio {
private:
	int 默认速度 = 0;


public:
	//@备注 初始化音频库，参考可以为空。默认值：int 设备ID = -1, DWORD 采样率 = 44100, DWORD 标志 = 0, HWND 窗口句柄 = 0
	//@返回 执行是否成功的逻辑值
	BOOL 初始化(int 设备ID = -1, DWORD 采样率 = 44100, DWORD 标志 = 0, HWND 窗口句柄 = 0);//注意参数默认值在声明指定不要在实现指定

	//@备注 使用后要释放音频库
	//@返回 执行是否成功的逻辑值
	BOOL 释放();

	//@备注 取错误代码
	//@返回 执行是否成功的整数值
	int 取错误代码();


	//@备注 选择本地播放音频文件，起始位置可省略
	//@参数 文件路径
	//@参数 播放位置，可为空默认0
	//@返回 成功返回播放句柄,失败返回0
	//@别名 打开文件(文件路径,起始位置);
	int OpenFile(wchar_t* 文件路径,int 起始位置=0);


	//@备注 【旧方法】 选择本地播放音频文件，起始位置可省略
	//@参数 文件路径
	//@参数 播放位置，可为空默认0
	//@返回 成功返回播放句柄,失败返回0
	int 置本地音频文件(wchar_t* 文件路径,int 起始位置=0);

	//@备注 选择网络URL播放音频文件，起始位置可省略
	//@参数 URL路径
	//@参数 播放位置，可为空默认0
	//@返回 成功返回播放句柄,失败返回0
	//@别名 打开URL(文件路径,起始位置);
	int OpenURL(wchar_t* URL地址, int 起始位置 = 0);


	//@备注 【旧方法】 选择网络URL播放音频文件，起始位置可省略
	//@参数 URL路径
	//@参数 播放位置，可为空默认0
	//@返回 成功返回播放句柄,失败返回0
	int 置URL音频文件(wchar_t* URL地址, int 起始位置 = 0);

	//@备注 关闭打开的音频文件
	//@参数 置播放音频文件时获取的播放句柄
	void 关闭文件(int 播放句柄);

	//@备注 播放
	//@参数 置播放音频文件时获取的播放句柄
	//@参数 播放模式 可为空，1=重新播放,0=继续播放,默认为真
	//@返回 成功返回播放句柄,失败返回0
	BOOL 播放(int 播放句柄, int 播放模式 = 1);

	//@备注 暂停
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回播放句柄,失败返回0
	BOOL 暂停(int 播放句柄);

	//@备注 停止
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回播放句柄,失败返回0
	BOOL 停止(int 播放句柄);

	//@备注 获取音乐时间 精确到小数 单位秒  例如 231.93826 秒
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回播放句柄,失败返回0
	//@别名 取媒体时间(播放句柄);
	double GetMediaTime (int 播放句柄);

	//@备注 【旧方法】 获取音乐时间 精确到小数 单位秒  例如 231.93826 秒
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回播放句柄,失败返回0
	double 取媒体长度(int 播放句柄);


	//@备注 取音乐长度 返回音乐总时长的一个整数 例如 62950172   对应 取播放位置() 例如 21265121
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回播放句柄,失败返回0
	int 取音乐长度(int 播放句柄);

	//@备注 取播放位置
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回播放句柄,失败返回0
	int 取播放位置(int 播放句柄);

	//@备注 置播放位置
	//@参数 置播放音频文件时获取的播放句柄
	//@参数 播放位置
	//@返回 成功返回播放句柄,失败返回0
	BOOL 置播放位置(int 播放句柄, int 播放位置);

	//@备注 取播放速度
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回播放句柄,失败返回0
	float 取播放速度(int 播放句柄);

	//@备注 置播放速度
	//@参数 置播放音频文件时获取的播放句柄
	//@参数 播放位置
	//@返回 成功返回播放句柄,失败返回0
	BOOL 置播放速度(int 播放句柄, float 播放位置);

	//@备注 取播放状态 0=停止,1=播放,3=暂停
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回播放句柄,失败返回0
	int 取播放状态(int 播放句柄);

	//@备注 取通道音量
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回音量float类型
	float 取通道音量(int 播放句柄);

	//@备注 取音量
	//@返回 成功返回音量float类型
	float 取音量();

	//@备注 取CPU使用率
	//@返回 成功返回音量float类型
	float 取CPU使用率();

	//@备注 置音量 0-100 0为静音
	//@参数 置播放音频文件时获取的播放句柄
	//@参数 音量 0-100 0为静音
	//@返回 成功返回操作结果
	BOOL 置音量(int 播放句柄, int 音量);

	//@备注 位置到时间
	//@参数 置播放音频文件时获取的播放句柄
	//@参数 播放位置int
	//@返回 成功返回float类型播放时间 秒
	double 位置到时间(int 播放句柄, int 播放位置);

	//@备注 时间到位置
	//@参数 置播放音频文件时获取的播放句柄
	//@参数 播放时间 float
	//@返回 成功返回时间对应的位置
	int 时间到位置(int 播放句柄, float 播放时间);


	//取音频数据
	//@备注 取音频通道数据，用于可视化频谱等
	//@参数 置播放音频文件时获取的播放句柄
	//@参数 缓冲区,可以使用动态数组做缓冲区，方便取成员值
	//@参数 缓冲区总长度（字节集长度 或 动态数组成员数 * 成员字节大小）
	//@返回 成功返回获取的数据长度，失败返回 -1
	//@别名 取音频数据(播放句柄,缓冲区,长度)
	int GetAudioData(int 播放句柄, void* 缓冲区, int 长度);

	//@备注 取位深度
	//@参数 置播放音频文件时获取的播放句柄
	//@返回 成功返回操作结果
	//@别名 取位深(播放句柄)
	int GetDepth (int 播放句柄);

};
